//:C15:OStackTest.cpp
// {T} OStackTest.cpp
#include "OStack.h"
#include "../require.h"
#include <fstream>
#include <iostream>
#include <string>
using namespace std;

// Use multiple inheritance. We want
// both a string and an Object
class MyString : public string, public Object
{
    public:
        ~MyString()
        {
            cout << "deleting string: " << *this << endl;
        }
        MyString(string s) : string(s){}
};

int main(int argc, char *argv[])
{
    requireArgs(argc, 1);    // File name is argument
    ifstream in(argv[1]);                             
    assure(in, argv[1]);
    Stack textlines;
    string line;
    // Read file and store lines in the stack:
    while(getline(in, line))
    {
        textlines.push(new MyString(line));
    }
    // Pop some lines from the stack:
    MyString *s;
    for(int i = 0; i < 10; i++)
    {
        if((s = (MyString*)textlines.pop()) == 0)
        {
            break;
        }
        cout << *s << endl;
        delete s;
    }
    cout << "Letting the descriptor do the rest:" << endl;
}
